package com.m1.tzolkin.model.buildables;

import java.io.Serializable;

import com.m1.tzolkin.model.board.ITZBoard;
import com.m1.tzolkin.model.exceptions.NoAvailableSkullException;
import com.m1.tzolkin.model.exceptions.NotAvailableActionException;
import com.m1.tzolkin.model.exceptions.NotEnoughCornException;
import com.m1.tzolkin.model.players.ITZPlayer;
import com.m1.tzolkin.model.util.card.IEffectCard;

/**
 * Un mod�le de construction avec une action associ�e.
 * Une construction avec une action associ�e poss�de un certain type.
 * Par ailleurs, son action ne peut �tre utilis�e qu'une fois.
 * 
 * @inv <pre>
 *     getType() != null </pre>
 * 
 * @cons <pre>
 * $DESC$
 *     Un objet constructible de type t qui co�te c.
 * $ARGS$
 *     IAmount c, BuildableType t, Action a
 * $PRE$
 *     c != null t != null a != null
 * $POST$
 *     getCost().equals(c)
 *     getType().equals(t)
 *     execute(b) ex�cute l'action a sur b </pre>
 *
 */
public interface IActionBuildable extends IBuildable, IEffectCard<ITZBoard, ITZPlayer>, Serializable {
	
	// REQUETES
	
	/**
	 * Retourne le type de ce constructible.
	 */
	BuildableType getType();
	
	// COMMANDES
	
	/**
	 * Place p comme nouveau propri�taire de ce constructible.
	 * @pre <pre>
	 *     p != null </pre>
	 */
	void setOwner(ITZPlayer p);
	
	/**
	 * Ex�cute l'action de ce constructible sur le plateau b.
	 */
	@Override
	void active(ITZBoard b, ITZPlayer p) throws NoAvailableSkullException, NotEnoughCornException, NotAvailableActionException;
	
}
